﻿using System;
using System.Text;

/// <summary>
/// 5位PNR与10进制数的转换函数
/// 由于国外系统支持19字符交易号，也考虑到数字交流的简单性（IVR，口头等），同时方便开发，提高性能，放弃用字母重新编PNR号的做法！！
/// </summary>
public class pnr_int
{
    //历史遗留物，仅作为兼容功能，不作为核心数据！
    private const string pnr_char = "A3B4C5D6E7F8G9HJKLMNPQRSTWXY";//删去: 012,IOUVZ
    private const int PNR_LEN = 6;//为了保留一位校验位，PNR增加到6字符
    //private static int CHAR_COUNT;
    private const int CHAR_COUNT = 28;
    private static int MAX_INT;


	public pnr_int()
	{
		//
		// TODO: 在此处添加构造函数逻辑
		//        
        //CHAR_COUNT = pnr_char.Length;
        MAX_INT = Convert.ToInt32(Math.Pow(CHAR_COUNT, PNR_LEN)) - 1;
	}
    
    public int pnr2int(string buf)
    {
        int p;
        int total=0;
        buf=buf.Trim();
        buf=buf.ToUpper();
        if (buf.Length != PNR_LEN) return -1;
        for (int i = 0; i < PNR_LEN; i++)
        {
            p=pnr_char.IndexOf(buf[i]);
            if(p<0) return -1;
            total = total + Convert.ToInt32(Math.Pow(CHAR_COUNT, PNR_LEN - i - 1)) * p;
        }
        return total;
    }

    public string int2pnr(int value)
    {
        if (value > MAX_INT || value < 0) return "";
        StringBuilder pnr=new StringBuilder("",PNR_LEN );
        int p_int;
        int i,j;
        for(i=PNR_LEN-1;i>=0;i--)
        {
            j = 0;
            for (; j <= CHAR_COUNT-1; j++)
            {
                p_int = Convert.ToInt32(Math.Pow(CHAR_COUNT, i)) * j;
                if(value<p_int)
                {
                    j--;
                    break;                    
                }
            }
            if (j > CHAR_COUNT-1)
                j = CHAR_COUNT-1;
            pnr.Append(pnr_char[j]);
            value = value - Convert.ToInt32(Math.Pow(CHAR_COUNT, i)) * j;
        }
        return pnr.ToString();
    }
}
